#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5, MOD=1e9+7;
vector<int> sons[MAXN];
int col[MAXN], f[MAXN], g[MAXN], n;
int main()
{
cin >> n;
for (int i=1; i<n; i++)
{
int x;
cin >> x;
sons[x].push_back(i);
}
for (int i=0; i<n; i++) cin >> col[i];
int sufs[MAXN], pres[MAXN];
for (int i=n-1; i>=0; i--)
{
int m = sons[i].size();
pres[0] = 1;
for (int j=0; j<m; j++) pres[j+1] = (long long)pres[j] * f[sons[i][j]] % MOD;
sufs[m] = 1;
for (int j=m-1; j>=0; j--) sufs[j] = (long long)sufs[j+1] * f[sons[i][j]] % MOD;
f[i] = pres[m];
for (int j=0; j<m; j++) g[i] = (g[i] + (long long)pres[j] * g[sons[i][j]] % MOD * sufs[j+1]) % MOD;
if (col[i]) g[i] = f[i], f[i] = 0;
f[i] = (f[i] + g[i]) % MOD;
}
cout << g[0] << "\n";
}
84. Largest Rectangle in Histogram | 60. Permutation Sequence |
42. Trapping Rain Water | 32. Longest Valid Parentheses |
Cutting a material | Bubble Sort |
Number of triangles | AND path in a binary tree |
Factorial equations | Removal of vertices |
Happy segments | Cyclic shifts |
Zoos | Build a graph |
Almost correct bracket sequence | Count of integers |
Differences of the permutations | Doctor's Secret |
Back to School | I am Easy |
Teddy and Tweety | Partitioning binary strings |
Special sets | Smallest chosen word |
Going to office | Color the boxes |
Missing numbers | Maximum sum |
13 Reasons Why | Friend's Relationship |